import { Logger } from './libs/logger';
import  eventBus  from './libs/eventBus';
// Todo 请填写 物联网开发平台 > 应用开发 中申请的小程序 AppKey
const APP_KEY = 'mbNGLkBvcrgiZENzl';

// 如果在开发过程中需要更换 AppKey，请按照以下步骤操作：
// 1. 修改 app.js 以及 cloudfunctions/login/index.js 代码中配置的 AppKey 和 AppSecret。
// 2. 在微信开发者工具的文件列表中，对 cloudfunctions/login 右键，选择【上传并部署：云端安装依赖】。
// 3. 在微信开发者工具的工具栏中，选择【清缓存】>【清除模拟器缓存】>【清除数据缓存】。
// 4. 在手机微信的小程序列表中，删除当前小程序。
// 5. 重新编译运行小程序。

const { AppDevSdk } = require('qcloud-iotexplorer-appdev-sdk');
const { EventTypes } = AppDevSdk.constants;
const SimpleConfigPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-simpleconfig').default;
const AirKissPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-airkiss').default;
const SmartConfigPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-smartconfig').default;
const SoftApPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-softap').default;
const BleComboPlug = require('qcloud-iotexplorer-appdev-plugin-wificonf-blecombo').default;
const { default: insightLogger, LogLevel } = require('qcloud-iotexplorer-logger');

const { subscribeStore } = require('./libs/store-subscribe');
const actions = require('./redux/actions');

// 小程序 SDK console 日志过滤
// 若返回 false 则不打印到 console
insightLogger.setDefaultConsoleTransportFilter((info) => {
  // 不打印指定事件的日志
  // if (info.event === 'xxx') return false;

  // 不打印 debug 或以上级别的日志
  if (info.level >= LogLevel.debug) return false;

  // 其他日志打印到 console
  return true;
});

App({
  globalData: {

  },

  onLaunch() {
    const systemInfo = wx.getSystemInfoSync();
    const platform = (systemInfo.platform || '').toLowerCase();

    Object.assign(this.globalData, {
      isIpx: (systemInfo.screenHeight / systemInfo.screenWidth) > 1.86,
      isAndroid: platform.indexOf('android') > -1,
      isIOS: platform.indexOf('ios') > -1,
    });

    // 初始化云开发
    if (!wx.cloud) {
      console.error('小程序基础库版本过低，请使用 2.2.3 或以上版本的支持库以使用云开发能力');
    } else {
      wx.cloud.init({
        // Todo 请填写您的云开发环境 ID
        env: '此处填写您的云开发环境 ID',
      });
    }

    // 初始化 SDK
    this.sdk = new AppDevSdk({
      debug: false,
      appKey: APP_KEY,
      getAccessToken: this.getAccessToken,
      wsConfig: {},
    });

    this.sdk.init().then(() => {
      console.log('腾讯物联网sdk初始化完成')
    });

    // 安装配网插件
    SimpleConfigPlug.install(this.sdk);
    AirKissPlug.install(this.sdk);
    SmartConfigPlug.install(this.sdk);
    SoftApPlug.install(this.sdk);
    BleComboPlug.install(this.sdk);

    // WebSocket 订阅设备信息
    this.wsSubscribe();

    console.log('App: onLaunch');

    this.console = console;
    if (wx.getAccountInfoSync().miniProgram.envVersion === 'develop') {
      console.error('【注意】开启 Logger 会影响运行性能，请避免频繁写入');
      this.logger = new Logger({
        logManagePage: '/pages/user-files/files?name=logs',
      });
      this.pluginLogger = {
        log: (...args) => this.logger.log('[Plugin]', ...args),
        info: (...args) => this.logger.info('[Plugin]', ...args),
        warn: (...args) => this.logger.warn('[Plugin]', ...args),
        error: (...args) => this.logger.error('[Plugin]', ...args),
      };
    }
  },

  // 订阅设备信息
  wsSubscribe() {
    subscribeStore([
      {
        selector: state => state.deviceList.concat(state.shareDeviceList),
        onChange: (deviceList, oldDeviceList) => {
          // 设备列表无变化时不重新订阅
          if (oldDeviceList
            && oldDeviceList.length === deviceList.length
            && deviceList.every((dev, index) => dev === oldDeviceList[index])
          ) {
            return;
          }

          // 当设备列表更新时，重新进行订阅
          if (this.sdk.isLogin) {
            this.sdk.subscribeDevices(deviceList);
          }
        },
      },
    ]);

    // 接收设备属性变化推送
    this.sdk.on(EventTypes.WsReport, ({ deviceId, deviceData }) => {
      console.log('接收设备属性变化推送====================', deviceData)
      actions.updateDeviceDataByPush({ deviceId, deviceData });
      if(deviceData._sys_xp2p_info) {
        eventBus.emit("_sys_xp2p_info", deviceData._sys_xp2p_info.Value);
      }
    });

    // 接收设备在线状态变化推送
    this.sdk.on(EventTypes.WsStatusChange, ({ deviceId, deviceStatus }) => {
      console.log('接收设备在线状态变化推送=======================')
      actions.updateDeviceStatusByPush({ deviceId, deviceStatus });
    });
  },

  // sdk.init() 会调用该函数获取物联网开发平台 AccessToken
  async getAccessToken() {
    // 小程序配置指引

    // 调用开发者自建后端服务，传入 code，获取物联网开发平台的 AccessToken
    // 请根据实际情况调整实现
    // const resp = await new Promise((resolve, reject) => {
    //   wx.request({
    //     url: 'http://47.106.218.29:8080/boray-web/tencent/iot/appapi/appGetTokenByWeiXin',
    //     method: 'POST',
    //     data: {
    //     },
    //     header: {
    //       'content-type': 'application/json'
    //     },
    //     success(res) {
    //       resolve(res.data);
    //     },
    //     fail(err) {
    //       reject(err);
    //     }
    //   });
    // });


    // return {
    //   Token: resp.Token,
    //   ExpireAt: resp.ExpireAt,
    // };
    return {
      Token: '0b72b4eb581649f3915b16623ee251af',
    };
  }

});

// ID: mbNGLkBvcrgiZENzl
// Secret: XIUViuFEBfayIxWoOJVn
// 对应三元组调整:
// 产品ID: R2TPXFV818
// 设备ID: R2TPXFV818/boston_test_0925
// 设备密钥: RrGxOBbI9BBNnG3eK7vp3w==